{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h1 align=\"center\"> Principle Component Analysis (PCA) for Data Visualization </h1>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd \n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load Iris Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "url = \"https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# loading dataset into Pandas DataFrame\n",
    "df = pd.read_csv(url\n",
    "                 , names=['sepal length','sepal width','petal length','petal width','target'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal length</th>\n",
       "      <th>sepal width</th>\n",
       "      <th>petal length</th>\n",
       "      <th>petal width</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.6</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   sepal length  sepal width  petal length  petal width       target\n",
       "0           5.1          3.5           1.4          0.2  Iris-setosa\n",
       "1           4.9          3.0           1.4          0.2  Iris-setosa\n",
       "2           4.7          3.2           1.3          0.2  Iris-setosa\n",
       "3           4.6          3.1           1.5          0.2  Iris-setosa\n",
       "4           5.0          3.6           1.4          0.2  Iris-setosa"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Standardize the Data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since PCA yields a feature subspace that maximizes the variance along the axes, it makes sense to standardize the data, especially, if it was measured on different scales. Although, all features in the Iris dataset were measured in centimeters, let us continue with the transformation of the data onto unit scale (mean=0 and variance=1), which is a requirement for the optimal performance of many machine learning algorithms."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "features = ['sepal length', 'sepal width', 'petal length', 'petal width']\n",
    "x = df.loc[:, features].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "y = df.loc[:,['target']].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = StandardScaler().fit_transform(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal length</th>\n",
       "      <th>sepal width</th>\n",
       "      <th>petal length</th>\n",
       "      <th>petal width</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.900681</td>\n",
       "      <td>1.032057</td>\n",
       "      <td>-1.341272</td>\n",
       "      <td>-1.312977</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.143017</td>\n",
       "      <td>-0.124958</td>\n",
       "      <td>-1.341272</td>\n",
       "      <td>-1.312977</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-1.385353</td>\n",
       "      <td>0.337848</td>\n",
       "      <td>-1.398138</td>\n",
       "      <td>-1.312977</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-1.506521</td>\n",
       "      <td>0.106445</td>\n",
       "      <td>-1.284407</td>\n",
       "      <td>-1.312977</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.021849</td>\n",
       "      <td>1.263460</td>\n",
       "      <td>-1.341272</td>\n",
       "      <td>-1.312977</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   sepal length  sepal width  petal length  petal width\n",
       "0     -0.900681     1.032057     -1.341272    -1.312977\n",
       "1     -1.143017    -0.124958     -1.341272    -1.312977\n",
       "2     -1.385353     0.337848     -1.398138    -1.312977\n",
       "3     -1.506521     0.106445     -1.284407    -1.312977\n",
       "4     -1.021849     1.263460     -1.341272    -1.312977"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(data = x, columns = features).head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## PCA Projection to 2D"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "pca = PCA(n_components=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "principalComponents = pca.fit_transform(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "principalDf = pd.DataFrame(data = principalComponents\n",
    "             , columns = ['principal component 1', 'principal component 2'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>principal component 1</th>\n",
       "      <th>principal component 2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-2.264542</td>\n",
       "      <td>0.505704</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-2.086426</td>\n",
       "      <td>-0.655405</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-2.367950</td>\n",
       "      <td>-0.318477</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-2.304197</td>\n",
       "      <td>-0.575368</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-2.388777</td>\n",
       "      <td>0.674767</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   principal component 1  principal component 2\n",
       "0              -2.264542               0.505704\n",
       "1              -2.086426              -0.655405\n",
       "2              -2.367950              -0.318477\n",
       "3              -2.304197              -0.575368\n",
       "4              -2.388777               0.674767"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "principalDf.head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        target\n",
       "0  Iris-setosa\n",
       "1  Iris-setosa\n",
       "2  Iris-setosa\n",
       "3  Iris-setosa\n",
       "4  Iris-setosa"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[['target']].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>principal component 1</th>\n",
       "      <th>principal component 2</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-2.264542</td>\n",
       "      <td>0.505704</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-2.086426</td>\n",
       "      <td>-0.655405</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-2.367950</td>\n",
       "      <td>-0.318477</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-2.304197</td>\n",
       "      <td>-0.575368</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-2.388777</td>\n",
       "      <td>0.674767</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   principal component 1  principal component 2       target\n",
       "0              -2.264542               0.505704  Iris-setosa\n",
       "1              -2.086426              -0.655405  Iris-setosa\n",
       "2              -2.367950              -0.318477  Iris-setosa\n",
       "3              -2.304197              -0.575368  Iris-setosa\n",
       "4              -2.388777               0.674767  Iris-setosa"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "finalDf = pd.concat([principalDf, df[['target']]], axis = 1)\n",
    "finalDf.head(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualize 2D Projection"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Use a PCA projection to 2d to visualize the entire data set. You should plot different classes using different colors or shapes. Do the classes seem well-separated from each other? "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfUAAAH6CAYAAAAeHtXEAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABeGElEQVR4nO3de3wcdb3/8dcnJWlpEsBSrilYsOHWFgoU8FKlVQ+XHMQLlxxBDhwLiIhSC/7aIwqIl2JVtEdBxKqIVBot4I0CcmmBiAotglAKpCLXgghV2KS0aZvv74/vbrPdzm5mk9nd2dn38/HYxzYzs7PfTLP7mfnO5/v5mnMOERERqX51lW6AiIiIRENBXUREJCEU1EVERBJCQV1ERCQhFNRFREQSQkFdREQkIRTURUREEkJBXRLHzHY0szPN7GYzW2Vmb5rZ62bWaWbTzWxQf/dmtoeZXW5my83sX2a2wcxeMbM7zex8M9s+6t9FimdmU83Mmdmlg3jtM+nXZh59ZvZvM7vfzD5lZtvked2g/zbM7NSs9zuq2DaLZDMVn5GkMbNzgO8DLwFLgOeAXYCPANsDNwInuSL++M3sTOB7wHDgEeB+4F/AjsAUYDzwmnNudHS/iQyGmU3F/79/yTl3aZGvfQZ4KzAP+DcwDNgL/7ezLXCzc+4jOa8Z0t+Gmd0DvBsw4Ebn3InFtFkkW+BZp0iVewo4HrjFOdeXWWhmnwceAE7Af0nfGGZnZnYK8EP8F/UJzrlbArZ5F3Dl0JsuMfEd59wzmR/MbDzwIPBhMzvSOXdPevmQ/jbMbF/gPcCdwCjgeDPbxTn3j4h/H6kR6n6XxHHO3e2c+212QE8vfxm4Ov3j1DD7MrNm4LvpH/8r6Es7ve8/AEcEvP59Znabma0xs3Vm9lS6m3ar7lgzW5rugq03s4vN7G/p1zxhZmdlbXeOmT2avq3wgpl9KfeWgpmNTe/rWjPbz8x+lW5DT/o2RGA3r5kNN7PZZvZXM1trZm+Y2X1mdnLAttnvMdbMFprZq+k2LzOz4woc14+a2ZJ0V/U6M1tpZl8ws+EB27r0sRltZteY2Utmtt7MVpjZ/+Rsey3+Kh3gkpyu9Kn52jMQ59wKYGn6x8PT7zWkv420zP/rT4BrgXrgjMG2U0RX6lJrNqSfN4bc/kT8FdSfnHO/L7Shc2599s9m9gn8bYAe4JfAK/iTiVnAB8zsXc65fwfsaiE+CCxOt/dE4Boz2wAcCJwO/A64C98jcTGwFvh6wL72Av4IPAb8ANgNaAduNbNTnHMdWe1tAG4HjgSewF9djky/f4eZTXLOfT7gPd6K7wF5GvgZ/ni1A782s/c755Zkb2xmPwI+DrwA3ITv5n478GXgfWb2H8653P+fHYA/AL3AImBEul0/NrM+59xP09v9Kv18OnAP/YEY4JmAthfD0s+Z2zaD/tuAzcf7dOAN4Gb8sf4mcKaZzS3m9pDIZs45PfSoiQf+JPZR/Jfy0SFf86P09l8p8r3eCqzHf2Hvl7PuqvQ+r8lZvjS9/EFgh6zle+OD2b+AvwMtWet2AF4F/glsk7V8bHpfDvhGzvtMxp8s/AvYLmv5/6a3X5yzr53xAdEB78zzHpfkvMfRmX3lLD8jvfwmYNucdZem152fszzzHvOBYVnLD8CfnD2es/3U9PaXDuJvJPN7js1ZPh5/4uSAdw/lbyNrn/+Vfv0PspbdmF72vkp/XvSozoe636WWXA5MwAea20O+Zrf08wtFvtfHgAbge865J3LWXQSkgNOCupuB2S7rCt459zTQiQ/gX3bOvZi17t/Ab4HRQEvAvl4HLste4JxbBixI7+/DWas+jg8oM13WlbJz7hX8VTTAmQHv8SzwlZz3uB2foHh4zrbn4wPxx51zb+as+zLwGnBqwHusTbdrU9Z7PI6/et8/3RUepRlmdqmZfdnMrsefaGUS5e5LbzPYv42Ms9PP12Yty/z7LEQGQd3vUhPM7DPABfhu5dOKeWn6udiu0EPSz3fnrnDO/cvM/oJPkNoPnzGdbVnA/lann5cHrMsE+TH4AJvtIedcKuA1S/FdvwcDP00HxXHAiwEnIdm/x8EB6x7ODrZZngfekfnBzEYCB+F7FmaYWcBLWA/sH7C8yzn3Rp73AH+CEvR7Dtb56WcHdAN/Ba6nPycDBv+3gZmNw/coPOmc+2PWqluBf+AT8kY7514tdt9S2xTUJfHM7FP4IUqP47s11xTx8kwwHVPk22YS4V7Ksz6zfIfcFc651wO2z1w5F1pXH7AuXxb1y+nn7XOei24v/p54kI1smYz7Fnwg3Am4JM9r8in0HuCHnkVpL5eV/Z7HYP82wF+JG1tepeOc25juGbgAf6vim4PYt9Qwdb9LopnZDPwY4seAac5nwBejM/38viJflwm+u+ZZv1vOdqWyS57lmXa9nvNcyvZmXvsX55wVegzhPcppUH8bZpad4T4nJ0Pf4QM6qAteBkFBXRLLzGYB3wYexgf0Vwaxm0XAGuAdZvb+Ad4v+/74X9LPUwO22wGYBKwDVg6iTcU4JM/95qnp578ApLvo/wa0mFlrwPbT0s8PDbYhzrluYAUw3sxGDXY/IWRuBUR99Z5rsH8bH8QnHz6JT7YLejwN7GNmR5ag3ZJgCuqSSGb2RXxi3HJ8l/ug7k2mg91n0j92mNnRed7v7fihYxnX4zPMP52+f5rty8B2wPUuYKhTxLbHD3nbzMwm45PRXscPpcr4Mb5L+BtmNixr+9HAF7O2GYor8AmEP06f3GzBzN5iZods9arivJZ+3nOI+yloCH8bmQS5i51zZwY9gK/lbCsSiu6pS+KY2en4jO9NwH3AZwKSsp5xzl0bZn/OuQVmti2+G/82M3uYLUuBvoP+BLDMa55Jd/1fCTxkZr/ADzs7Mr39E/jx6qV2L37c8xH4TPHMOPU64BM5yWffBI7FX0k+YmaL8WOnT8JfWc51znUyBM65H5vZocC5wN/MLJMlPwo/pv49+EIs5wzhbZ7EJw/+l5n1pvfvgJ8553ITCYek2L8NM9sLeH/6518V2PVCfC/TCWb26SLzQKSWVXpMnR56RP2gf7xzocfSQex3D3yBl4fwiVsb8IF6CTCDrDHfWa85Cvg9/kt+PbAKmEvWOPSsbZf6j2Tge19LwPjpnN93ataysell1+KzyX+dbsNafHAPHKePL+ryeXwOwpv4jPJO4KMB225+jzz7KvT7HIcvoPMKfgz+y/gCNl9h63H9ef+/8h0X4DB8cZ7Xgb7c41Pg//iZfMc5ir8N4Kvp/V8RYp/XpLf9bKU/U3pUz0MTuogkkJmNxReq+alz7ozKtkZEykX31EVERBJCQV1ERCQhFNRFREQSQvfURUREEkJX6iIiIglR9ePUR48e7caOHbvFsp6eHhobGyvToJjRseinY+HpOPTTseinY+FVw3FYvnz5q865nYLWVX1QHzt2LMuWbTmp1dKlS5k6dWplGhQzOhb9dCw8HYd+Ohb9dCy8ajgOZpa3iJK630VERBJCQV1ERCQhFNRFREQSQkFdREQkIRTURUREEkJBXUREJCEU1EVERBJCQV1ERCQhFNRFREQSQkFdREQkIRTURUREEkJBXUREJCEU1EVERBJCQV1ERCQhqn7q1URKpaCjA7q6oLUV2tuhubnSrRIRkZhTUI+bzk5oa4O+PujpgcZGmDkTFi+GKVMq3ToREYkxdb/HSSrlA3oq5QM6+OfM8u7uyrZPRERiTUE9Tjo6/BV6kL4+v15ERCQPBfU46erqv0LP1dMDq1aVtz0iIlJVFNTjpLXV30MP0tgI48aVtz0iIlJVFNTjpL0d6vL8l9TV+fUiIiJ5KPs9TpqbfZZ7bvZ7XZ1f3tRU6RaKiAxIo3IrR0E9bqZMgdWr/Sdi1Srf5d7eroAuIlVBo3IrS0E9jpqaYPr0SrdCRKQo2aNyMzK5v21t/npF1yelpXvqIiISCY3KrTwFdRERiYRG5Vaeut9FRCQSmVG5QYE9e1SuEulKR1fqIiISiTCjcjs7oaUFZsyAuXP9c0uLXy5Dp6AuIiKRyIzKbW7ur6PV2Ni/3DlNb1Fq6n4XEZHIFBqVO3/+wIl0GvgzNArqIiISqXyjcpVIV3rqfhcRkbLQ9Balp6AuIiJloektSk9BXUREymKgRDpVmxs63VMXEZGy0fQWpaWgLiIiZaXpLUpH3e8iIiIJoaAuIiKSEArqIiIiCaGgLiIikhAK6iIiIgmhoC4iIpIQCuoiIiIJoaAuIiKSEArqIiIiCaGgLiIikhAK6iIiIgmhoC4iIpIQCuoiIiIJoaAuIiKSEArqIiIiCaGgLiIikhAK6iIiIgmxTaUbUBNSKejogK4uaG2F9nZobq50q0REJGEU1EutsxPa2qCvD3p6oLERZs6ExYthypRKt05ERBJE3e+llEr5gJ5K+YAO/jmzvLu7su0TEZFEUVAvpY4Of4UepK/PrxcREYmIgnopdXX1X6Hn6umBVavK2x4REUk0BfVSam3199CDNDbCuHHlbY+IiCSagnoptbdDXZ5DXFfn14uIiEREQb2Umpt9lntzc/8Ve2Nj//Kmpsq2T0REEkVD2kptyhRYvdonxa1a5bvc29sV0EVEJHIK6uXQ1ATTp1e6FSIiknDqfhcREUkIBXUREZGEUFAXERFJCAV1ERGRhIhVUDezPcxsiZmtNLMVZnZ+pdskIiJSLeKW/b4RuMA595CZNQPLzewO59zjlW6YiIhI3MXqSt0595Jz7qH0v1PASqClsq0SERGpDrEK6tnMbCxwMPDnCjdFRESkKphzrtJt2IqZNQH3AF91zt0UsP5s4GyAXXbZ5dCFCxdusb67u5smVWwDdCyy6Vh4Og79dCz66Vh41XAcpk2bttw5NzloXeyCupnVA78DbnfOXTHQ9pMnT3bLli3bYtnSpUuZOnVqaRpYZXQs+ulYeDoO/XQs+ulYeNVwHMwsb1CPVaKcmRnwI2BlmIAuIiLxkEr5KS66uvys0+3tfu4qKa9YBXXgXcBpwKNm9nB62eedc4sr1yQRESmksxPa2qCvD3p6/GSUM2f6ySinTKl062pLrIK6c64TsEq3I3Z0CiwiMZVK+YCeSvUv6+nxz21tfpLKmN+iTpRYBXUJoFNgEYmxjg7/9RSkr8+v1ySV5RPbIW3ClqfAmVPfnp7+5d3dlW2fiNS8rq7+r6dcPT2walV521PrFNTjLMwpsIhIBbW2+g7EII2NMG5cedtT6xTUByOVgvnzYdYs/5x9MylKOgUWkZhrb4e6PJGkrs6vl/LRPfVilfMed+YUOCiw6xRYRGKgudl//eV+LdbV+eVKkisvBfVilDvNs73dnzAE0SmwiMTElCn+66+jw3cgjhvnv54U0MtPQb0Y5U7z1CmwiFSJpiZluceBgnoxKnGPW6fAIiISkoJ6MSp1j1unwCIiEoKy34uhNE8REYkxBfViZO5xNzf3D8xsbOxfri5xERGpIHW/F0v3uEVEJKYU1AdD97hFRCSG1P0uIiKSEArqIiIiCaGgLiIikhAK6iIiIgmhoC4iIpIQCuoiIiIJoaAuIiKSEArqIiIiCaGgLiIikhAK6iIiIgmhoC4iIpIQCuoiIiIJoaAuIiKSEJqlLe5SKT/Na1cXtLb6aV6bm4vfRkREEk9BPc46O6GtDfr6oKcHGhth5kxYvNjP6x52GxERqQkK6nGVSvlgnUr1L+vp8c9tbbB6NTg38DYiIlIzFNTjqqPDX30H6evz650beJu3va10bRQRkVhRolxcdXX1X3Xn6umBVavCbSMiIjVDV+px1drq748HBe3GRhg3zl+pD7SNiIjUDF2px1V7O9Tl+e+pq/Prw2wjIiI1Q0E9rpqbfQZ7c7O/6gb/nFne1BRumyCpFMyfD7Nm+efsRDsREala6n6PsylTfAZ7R4e/Pz5unL/6zg7WYbbJpiFwIiKJpaAed01NMH360LeBcMPk8p0MiIhI7Kn7vZaEGSYnIiJVS0G9lmgInIhIoimo15LMMLkgGgInIlL1FNRriYbAiYgkmoJ6LRnsEDgREakKyn6vNcUOgRMRkaqhoF6Lwg6BExGRqqLudxERkYRQUBcREUkIBXUREZGEUFAXERFJCAV1ERGRhFBQFxERSQgFdRERkYRQUBcREUkIBXUREZGEUEW5apRK+TKvXV1+5rX2dl+/XUREapqCerllB+Q99vDLnn8+fHDu7IS2Nujr83OgNzbCzJl+QpYpU0rffhERiS0F9XLKDcjZwgTnVMq/PpXqX5bZT1ubn6hFE7OIiNQs3VMvl+yAnBvQwS/LbNPdHbyPjg5/QhCkr8+vFxGRmlUwqJtZi5l90cy+a2bnmNlbArbZ38zuLl0TE6JQQM5WKDh3dQWfEIBfvmrV4NsnIiJVL29QN7NW4FHg/wHTgO8AT5nZ8TmbbgccWaoGJkahgJytUHBubfXd9EEaG/3c6CIiUrMKXal/HXgS2NM5NwHYA7gVuMnMZpajcYlSKCBnKxSc29uhLs9/WV2dXy8iIjWrUFB/B/A159y/AJxz/3TO/TfwaeDrZjavHA1MjEIBOdtAwfmTn4SGBhg+3P/c2Ogz5hcvVpKcSAKkUjB/Psya5Z+z82JFBlIo+31bYG3uQufc983sReAGM9sd+F6pGpcomcBbKPu9ri5/cM7OnO/t9YG9vh7OOw++8AUFdJEE0IhVGapCQf1J4N3AXbkrnHO/MbP/AH4LHFaitiXPlCl+2FlHh79vPmaMX/7CC77Lvb09ODgHDWXr7fXPV13lg7qIVLVKjVjNlM7YdlvfM6BaVtWtUFC/DTjTzOY459bnrnTO3W9m70lvJ2E1NcH06eG2zXzaFi2C9Vv9F3iZbPmw+xSRWAozYjXqj3l2z8CXvgSXXKKegWpXKKh/E/gFBe67O+dWmNkhwAFRN6zmFSpUk01D2URiqdhqzmFHrEZVJVq1rJIpb1B3zqWAFQPtwDn3T+CeKBtV84I+bfloKJtI7Azm3nhmgExQYM98zKO6555K+XScdeuC16sDsHrFrqKcmf3YzF4xs8cq3ZaKCVuoBjSUTSRmgopHhikYOdCI1ba2we03V2cntLTAz38OGzYEb6MOwOoVu6AOXAscU+lGVFSYQjUayiYSS4Ot5pz5ODc395e0yP6Y33LL0KtEZ59wbNyYfzt1AFav2E3o4py718zGVrodFVWoH274cHjve+GEE/Jny4tIxQylmnPuAJnsQTG//e3Qq0SH7QRUB2D1MudcpduwlXRQ/126kl3Q+rOBswF22WWXQxcuXLjF+u7ubpqqOdj19cEjjwR/+urq4KCDwhWyIQHHIkI6Fp6OQ79SHItXX/WzKef7+O6xB4weXZn9vvgivPxy8LoxY7p58cUmzPx1Ra3+iVTD52PatGnLnXOTA1c65wZ8ABcDu+dZtxtwcZj9hH0AY4HHwmx76KGHulxLlizZalnVue8+50aOdA62fGy7rV8XUiKORUR0LDwdh36lOBZvvOFcc/PWH13wy1Opyu33hz90rrExeB/f+tYSd/rpg29fUlTD5wNY5vLExLD31C8BxuRZt3t6vUQp39X4m28WlxUjImU10L3xwV4ERrHfQsl4ZvC979XuFXpShL2nbkC+fvoxwL+iaY5s1tHhT6CDaLyJSKwVujdeyf0GVavOVKh+29tg4cKhj3+Xysob1M3sdOD09I8O+L6ZvZGz2QhgIvD7qBpkZjcAU4HRZvYCcIlz7kdR7b9qaO50kapWTPHIcu436MRgjz1gxQr44hdVc77aFbpSXwu8lv63Aa8Da3K26cVPx3pVVA1yzn00qn1VtTCVKEREBiH7xCCV8uPWL7lky/HvoMpy1ahQRblfAr8EMLOfAF92zj1drobVvPZ2f6ocRONNREomtT5Fx4oOul7ronXHVtrHt9M8vPr6ocOWky00zG3TJt3pqzah7qk75/6n1A2RHIVufqngjFSJaguQnc910ragjT7XR8+GHhrrG5l5+0wWn7qYKXtWTz90MeVkC93pW7sWlixRUK8moYvPmNlk4CP4xLgRueudcydH2C6B0mXbiJRBtQXI1PoUbQvaSPX2z7nQs8FHu7YFbay+YDVNDfH/7BU7UUtrK4wcmX9/N94IV19dXV87UU16U41CDWkzs08CDwBnAm8Ddgp4SClkbn7NmeOfq+mTJTUrO0BmAmPPhh5SvX55d2/8hmR2rOigzwX3Q/e5PjoeC1GHNQaKLVPb3u672fMZNixcCdq4yNS2nzED5s71zy0tfnktCHulfiHwY+Ac51yBisEiIuEC5PRD4tWn2/Va1+YTkFw9G3pYtaY6RpwUO3CmudlXnc6nmgbbaDrZ8BO67AzcoIAuImFUY4Bs3bGVxvrGwHWN9Y2MG1UdI04yA2eC5Bs4M21a/qI01TTYZrCT6SRJ2KB+K3BEKRsiIslRjQGyfXw7dRb8lVhndbRPqI4RJwNN4Ro0cKbQYJpqGWyTSsGiRSrvETaoXwmcbmaXmNk7zeyA3EcpGyki1aWUATK1PsX8h+Yz645ZzH9oPqn1qYFfFELz8GYWn7qY5obmzSckjfWNNDf45dWQJAeDKyfb3Oyv8KMubVsumfvoS5bk36aaehyGIuw99cyhugQ/uUu2TAnZYVE1SkSqWyZA5ma/11ndkAJkqTPqp+w5hdUXrKbjsQ5WrVnFuFHjaJ/QXjUBPWMwA2eamqpzsE3QffQg1dLjMFRhg/q0krZCRBIn6gBZriFnTQ1NsUviG4zBlJMtVWnbUhpojvjhw6GhoTp6HKIQtvjMPaVuiIgkT5QBshoz6qX0CmX7A7z3vfCLX9RGQIfw99QBMLNjzeyLZnaNme2ZXvYeM9u9NM0TEfGqMaNeSm+gbP8TTqidgA7hi8/sYmZ/Bn6Ln7ltOjA6vfp/gC+WpnkiIl41ZtRL6Q0m2z/Jwl6pfxdoAvZLPyxr3Z3A+yJulwxGKgXz58OsWf55oMwRkSpSTUPO4vZRjFt7ojSYbP8kC5sodwxwunNulZnlZrm/ALRE26wEK1VR4nwzOPz850Pft0gMlCqjPmrFTKYSJKqviMx+liyBm27yV61r1yZzrnRNk9Ev9IQuQL7qwKOBNyNoS/IN9dOeT6HaiF1d0N1dm3/dkjhxH3I21DKlUX1FZPazaZMP5NmSWja1GjP3SyFs9/t9wKdzrtJd+vnjwN2RtiqJsj/tmU9VT0//8u4hTHAx0JiOWqiNKDUjk1E/5/1zmH7I9NgEdBhamdKoviKy95Mb0Itpj1SnsEF9FnAY8BjwZXxAP8vM7gXeAXyhNM1LkFIWJS40pqOvrzZqI4rEQLGTqWSL6itioHP8sO2R6hQqqDvnHgMOBZYBZ+C74j8CPA8c4Zx7qlQNTIyhfNoHUmhMR11dbdRGFImBwUymkhHVV8RA47bDtkeqU+hx6s65vznnTnPO7e6ca3DO7eqcO9U511XKBibGUD7tAyk0piOzXkQik6/+/FCGV0X1FVFoP/nak0rBq68mMzu+1hRVfEaGoJSDKQuN6WhtTU4mjNS8Uk3mUozO5zppuaKFGbfNYO79c5lx2wxarmih87nOIQ2viuorYqBz/Nz2ZCZDef55mDsXZszwP3d2hns/iZfQ2e9mdiK+y30MMCJ3vXPu8AjblTyZT1FuamtdXTSDKfON6Vi2LJr2i1RYqSdzCSNM/fkpU5oGNbwqqq+IoP2MHOkz4U880c+dnmlPdlJd5j58UrPja0WooG5ml+JnZ3sEeBzoLWGbkqvUgyk1pkMSqlyTuQwkbP35wX4Uo/qKCLufMMl5+kqpLmGv1KcDlzvnPl/KxtSEoQTeUhWuEYm5uEzmUo7681Gdmzc1wckn+6+Mp56ChQu3/soYbHKevoriK2xQbwbuKmVDZAClKlwjUgXiMplLpv58UFviVn8+zFdGJqkuKLDnS87TV1G8hU2UW4gvFSuVUMrCNSJVoJSTuRSTfFct9efDfmUUm5ynr6L4CxvU7wJOMLOfmNkpZtaW+yhlI2veT38KvXnSGFQWSmpAscE0bKDu7u3Om8keJFN/vrmhefNJRmN9I80NzbGqPx+2kE12tn4muBfK1i9lDS2JRtju98x/1Vj81Ku5HJA70YsMRu7Nqj339H1bGzYEbz9QVYq+Pj/wVDe/pIoVM5lL2Cz51PoUXWu6ik6+i3v9eSjuXnkmqe6222D27MLJeaWsoSXRCBvU9yppK+IgDpkfuTerRo4sXLwZClel6OyERx6BL35RN7+k6oUJpsVkyXesyH9ZOVDyXab+fFwVe6+8qQlGj4Y5c6Ldr5RfqKDunHu21A2pqDhkfqRScOyxW96UGiigQ/6qFJmbXJdcsuXNL9AAVKlaAwXTYrLku17rYme3c+C25Uy+K4X2dv8VFmQota5KtV+JTuiKcma2jZm1m9l3zWxB+vlkMytm+tb4iUvmx1e+Uvx7NTTkr0qhm19Sg4rJkm/dsTXvffq4ZbIXayiV7SqxX4lO2OIzOwO/Bw4EngH+gZ+d7VPAI2Z2lHPun6VqZEnFofpCKgXf+U5xr2logCuuyN+TUMzNrzjcehCJQDFDztrHtzP/qfmB+4lTJvtglarWValraMnQhL3KvgLYET8j24OZhWZ2GHBjev1p0TevDOKQ+dHRAWbFvWb4cDg9KGcxrdCsDsOHw8MP+wS6Pff0tSM16FQSoH18OzNvD+4fzg3UzcObaR3VSnND84DJd9WqVEUmVbwyvsIG9TbgvOyADuCce9DM/hf4buQtK5c4ZH50dcH69YW3ybQxbDHoQje/1q/3qa733rv1fXvdd5cqVkyWPPh79FFnsset4ytu7ZHSChvUhwP5KjKkgIZomlMBccj8KHRiAfDZz8L48YObHeLBB/Pvu1Aingo/S0yl1qfoWNFB12tdtO7YSvv4dpqH90epYoecRZnJHoec20q3J+4nEXFv31CFDep/AmaZ2d3Ouc3RwcwagVnp9dWp1LOnhVHoxKKpCS67bHDtmDLFF62ZNw8WLYK7785fxCaXBp1KDIUdg16JIWfZObcZlez4qkR74nZSU23ti0LY7PcLgPHA82a20MzmmdkNwPPAAen11SuT+TFvnq++MG+e/7lc/8uFUkpvvXVon7y6On+1feCB4QN65v016FRiJHsMeiYRrmdDD6lev7y7t7I1SuM24KSjw0+3Wq72xGUgUbW2Lyphx6k/bGatwIXAYfgs+JeAq4ErnHOvlq6JZVLpzI9Sp5QO1MWfS4NOJWbiMlNbPnHIuc22ZEn+O2ylaE8cBhIVEvf2RSX0GPN04J5dwrZIKU8sCnXxQ/GJeCJlFpeZ2vKJQ85tRioFN92Uf/3IkdG3J24nNbni3r6oFFU4xsx2ACYAuwGrgRXOuX9H3ywpaDCZHoVyBxYtguef16BTibW4T3sah5zbjI6O/LOvge+Wj7o9cTqpCRL39kUlbPGZbYCv4ovNjMxatdbMrgIucs7lmXFEIjWUTA9VjZAqVswY9ErIPm/e1OdY22PUj1jPsDpj0a820tQ0cuCdRKSrq/DglhNPjP5jH6eTmiBxb19Uiik+czZwGXAT8AqwM3AC8EVgBPCZUjRQskSRzlrp3AGRQSp2DHolTJkCi/58P8d/YQHbvLoXG3ZYSf2k33Hin99k8bgtM/RLaaCr0mnTon/POAwkqub2RSVsUD8N+Lxz7oqsZWuAr5rZOuALKKiX3k9/mr9ITZIyPUTyiPu0p6n1KU781TGsP7D/xHstQG/h6VyjVqmr0rh3Bsa9fVEIG9T7gBV51j2Gn09dSqmzEy64IP+wtCRleogUEOdpT+OSod/cDJdfDp/61NbrLr+8tEEs7p2BcW/fUIUdp/4z4Mw8684Cro+mORIo0+1eaJz5yJH+FHTWLF/TPbuLXkTKYjAZ+qmU/8hG+dFNpXzJjSCzZydnTLZsLeyV+rPACWa2AvgN/ffUPwg0A98ys3PT2zrn3Pcjb2ktKzTAMmPtWp/FvnbtlslzIjVooFKypRImQz978ArAVVeBc9FWOKuVMdmytbBB/Vvp5xZg/4D12ffaHaCgPlTZn/xHHglXNCaT7pqdPPerX5WsiSJxFLaUbCkMlKG/x+sfpaWlP1ErV1RlXOM+Jjvp9dcrKWxFubDd9BKF3GFrDQXmy9lmG5/5EtQ139cHa9aUrp0iMZNdSjYjc9VcjkS1Qhn6iz54Oye+fWSo7vWhXk3HeUx2LdRfryQF67gJKlBc6F56voAO/vUDTekqkiBhEtVKLZOhP++Yecx+12zmHTOP1Res5rn73zHgXbSMoV5Nt7fnLz5TyTHZtVJ/vZKKrSi3L74LfkTuOuecbuBGYaD758OH+0CdGWD5yU/ClVfmPyUfPrx0bRWJmbiUkg3K0C/UJZ5rqFfTcR2TrXv9pRe2otxE4Ab8/XQL2MQBwyJsV+0a6JP/3vfCQQf1D7B0Dr6fJ4Whrg5GjSpNO0ViKM6lZIuZUymKq+k4jsmO+73+JAh7pf5jYANwHLAKKGIOTynKQDfDTjhh61PZQqfkGzeWp90iMRDnUrIDzakE0V9Nx21Mdpzv9SdF2KC+P3CCc+72UjamJuWmgba15f/kmwWfvhc6JV+6tKTNF4mTOJeSzdclbuaLxJjF42q6lGql/nolhQ3qDwB7lrIhNSlfGujll8OFF8Kbb265fV8fPPxwcIpo3E7JRSokzqVk49glXk5xvdefJGGD+tnADWa2FlgC/Dt3A+dcgTmBZCuFJmeZNQuGBaQorF079AGsIjUgzqVka/38u9ZPbEotbFB/FXgGuK7ANkqUK0ahNNDeXt8XF0QpoiJS5Wr9xKaUwgb164F3AN9EiXLRKJQGWmhceqlSRFXiSUSk6oUN6tOAs5xzPy9lY2pKoTTQhgZ/pR5UOKYUKaIq8SQikghhK8o9Q3paYClSvimYCpV8amiA+vrgdVGniKrEk4hIYoQN6p8DLjKzsSVsS/J0dkJLC8yYAXPn+ueWFr88kwba3OyvjME/NzfDrbf6R9C6qFNEw5R4EkmgVApefVWzFUuyhO1+/xJ+SNtTZvYMwdnvh0fXrAQolN2eyWAfKA20HCmiKvEkNShzx+lLX/Ln27rjJEkRNqg/ln5IWGGLHBdKA21qgpNP9ts+9RQsXBh9AptKPEnC5c6t3rZnO21tzaRS/R/RqKY8Fam0sFOv/k+pG5I4UVwBlyOBTSWeJGZyg3D7+Haahw/uRLbzuU6O/fHJ9D7yYXr/uQcNO/0FNq6kbtNcgkbhasSoVLuiZmkDMLPRwFuANc6516JvUkIM9Qo4TPd9FJcTKvEkMdL5XOdWJV5n3j6TxacuZsqexZ3IptanOOqrl/HmtU+Aq4MNTfTWd0NfPWwKLquhO05S7ULPp25m7Wa2EvgH8ATwipmtNLOTomyQmR1jZk+a2Sozmx3lvstqqBMalzOBLXNvf948mD3bP2fu+YuUSWp9irYFbaR6U5tnWevZ0EOq1y/v7i1uJMZPH7iJN6+9EXq3gw3pk9MNTbBpOH5iya3pjpNEKd/gp1IKO/XqR4EFwK3AHHxg3wVoBxaa2TDn3MKhNsbMhgFXAv8BvAA8aGa/cc49PtR9l91Qr4DLncCmEk9SYR0rOuhzwSeyfa6Pjsc6iir9+rubG8HlqcyYh+44SVQqVf4jbPf7RcA1zrlzcpZfZ2ZXA18AhhzUgcOBVc65pwHMbCHwQaD6gjoMrcixEtikxnS91hU4Dzr4K/ZVa4o8kV0zrv8KfSsGuM3VmHXHSaJUrrunQcJ2v48Dbsyz7sb0+ii0AM9n/fxCeln1ylwBz5nTn+0exlC770WqTOuOrTTWNwaua6xvZNyo4r5mjjtiP2go1GXvI/rMmeW541SJrlipjEqW/zDngu8tbbGR2bPA1c65OQHr/hc4xzn31iE3xt+fP9o5d2b659OAw51zn87Z7mz8zHHssssuhy5cuGUnQXd3N01JON3u7vbd8OD/EjJBvrU19MlBYo5FBHQsvHIfhz7Xx5o317B+03qGDxvOqG1HUWdbn7D2uT4e+ccjgV3wdVbHmO3G0Lupt+A+tthfHzzySP4vV4A99uimrq6J0aOL/rWKEsFHueT0+fCiOA4vvggvv5x//a67+jpkgzVt2rTlzrnJQevCdr//BLg0fc97Ef6e+s7ASfiu962C/SC9AOyR9fMYYHXuRs65a4BrACZPnuymTp26xfqlS5eSu6xqdXcPqQBNoo7FEOlYeOU8DkHZ7HVWlzebveG5hq22dzicc9RZXah9bLG/Bnjvex0bNgTfW//mN5fy6qtTmRPVN1iAVMp/gQddmTc3x2dcvD4fXhTHYf58uOSS/HdP582DUh3qsEH9MqAemI2vLpfxJn7mtssias+DQKuZ7QW8CPwXcEpE+65OSmCTKpWdzZ6RuWfetqCN1Respqlhy2g2Zc8prL5gNR2PdbBqzSrGbDeG2XfOpntjd+h9bLG/KXDFFcaFFwbPj1RXN/j0lLDj6cPWoZLkqGT5j1D31J1zfc65i/BX0VOBj6af93DOfcGF6cMP9z4bgfOA24GVwC+ccyui2LeIlFeYbPYgTQ1NTD9kOnPeP4fh2wzH5Rl+Vmgf2U4/3V+x5zOYL9jO5zppuaKFGbfNYO79c5lx2wxarmih87nOrbZVJebaU2hqj1InYxZVfMY59y/gvhK1JfMei4HFpXwPESm9KLLZo9hHodGlg7mnXWwPhAay1KahDH4airxX6ma2v5m9ZmZtBbZpM7NXzeyg0jRPRKpVFNnsUWXE56uvNJgv2GJ7IDSQpXYNdvDTUBTqfv9/wP3pK+dA6XX3ARdE3TARqW7t49vzZqjXWR3tEwaOZlHsIyOqL9hiew8q2RUrtadQ9/tRhAvWC4FvRdMcEUmK5uHNLD51cd7s9+wu6nxJZ8Xso1wyvQdBgT1f70GlumKl9hQK6qPxQ8wG8iKwUzTNEZEkyc1mHzdqHO0T2rcIxgNN4hJmH+XUPr6dmbcHpzYX6j3QQBYph0JBfQ3hqrm1pLeVUkil/Ol9V5fPuIl6PnWpeVFOdRokk82e773DJJ01NTRx8viT6VjRwVOvPcXCxxZG3s6w4th7EERfHbWpUFC/B5gODDRm5OPpbSVqlZoRQGpG1FOdFntyEHYSlyjbGYW49R7kBvA994QTT9RXRy0qFNQvB/5sZj8GLnTObXE1bmY74AvPHAkcUbIW1qpKzgggNSG1PsWxC47dYkrTYgq7ZBts0A2TdDaYIjaDUexJSaEeiHLKPfcfORLWrt1yG3111I682e/OuYfxRWZOBF40s/vMbIGZXW9m9+LLt54MnOKce6Qsra0llZwRQGrCV+77St45ysMWdoGhzYNeaMjayPqRrO5ezUm/PIn1mwLKwRXZzkKKKSYTJ9nn/pnAnRvQs+mrI/kKVpRzzt0E7Iuv7b4eOAQ4FOgFvgbsm95GoqYyVFJCqfUpvv3Hb+ddX8xUp4OtHAeFh6yt3bCWRSsWcfvfbqd3U++Q25nPUE5KKq3QuX8QfXUk34BlYp1zLznnLnPOvd85t3/68X7n3Feccy+Vo5E1KVOGKojKUMkQdazowCx4khOA4cOGhy7sMpSqb5mks+aG5s1X7CPrR25ev3ZjgctOBjcla66hnJRUWqFz/yD66ki+sPOpS7mpDJWUUNdrXXmvfgEcLnRhl6FWfcsknc07Zh6z3zWbEw84kZHbjCz4moxiC9AEiaIUbaUUOvcPoq+O5FNQjyuVoZISKhSIAT57xGe3Kg4z/6H5zLpjFvMfmk9qfX/SWhRV37Incdm1cddQV+jNDc2RDCGLqhRtJRQ69wd9ddSioiZ0kTJTGSopkUIFVJrqm/jCkV/Y/PNAme1Rj9suVLFt+LDhvHev93LC/idENoRsq2Oxvgkea4c149i48wu0fSK+l7aFJqtZtAief15fHbVGQT3uVIZKSiBsIA47nCzKcduFTjgahjXwi5N+Eel48OxjseHvR7DupzcCddDbhI3cxL57DYv1+G6d+0s2BfVKKFTqSWWgpEzCBOKwxWEgunHblajYNmXPKTx59mr23rMBevsnX1+3dhjrgP/4DzjnHBg/Pp4fSZ37S0beoG5m4TJV0pxzhW+CiVeoShyogpyU1UCBuFJJZJWo2HbLzU0MyzMgYN06+M539JGU+Ct0pd4NuCL2NWyIbUm+QlXijj3WP3d3b71OZaCkQgYzI1lUyl2xLczwMH0kJe4KBfWPU1xQl4H89KewPrgyFr29kG/ccKYMlPrXpMwGOyNZNcoMDwsz7lsfSYmrvEHdOXdtGduRfJ2dcMEFPngHybccVAZKKqZaZiSLQnu771oPQx9JiSuNUy+HTLd7ocDd0ADDhwevUxkoqaApe07hyfOe5IT9T+CIliM4Yf8TePK8JysyO1opBZWGyEcfSYmr0NnvZtYOnAXsA4zIXe+c2znCdiVLmALNDemM26DueZWBkgrKHaf+2CuPcfMTN1ds2tNSyh4e9vjjcOWV+khKdQkV1M3sFODHwLXAe9P/rgOOB/4NXFea5iXEQBk49fVw663+30FVJFQGSiokymlPw05tOph52aOUPTzswx/WR1KqS9gr9c8BX8bPsX42cJVz7iEzawbuADScrZBCGTjDh8O3vtU/PkZVJCRGihmnXkjY+dYHOy97qVSqsIvKVchghQ3qrcAfnHObzGwTsB2Acy5lZl8Hvg18s0RtrH6FMnAaGuD00/t/VhUJiVjule/ebu/Qr41inHrYq/0oewWiFPVHcqCAXaiUhcbGy0DCJsq9DmSyuF4E9s9aZ8COUTaq6qRSMH8+zJrln7PHocPQJ2d56il45ztht93881NPleb3kMTpfK6TlitamHHbDObeP5cZt83gkX88QudznaFeH8VkJ2GnNq3mKVDD6uyElhaYMQPmzvXPLS1+OWxZyiLTsdfT0788u4yFSJCwQX0ZcGD6378BLjazs8zsdOAbwJ9L0biqMNCnNCPTjzdvHsye7Z9Xrx741HvmTNh3X/jjH+Hll/3zvvuGH3sjNSv7yjdzxduzoYc+10fbgja6eweOEFHMwBb2ar+ap0ANI0zALpRTmxkbL1JI2O73OcBb0/++OP3vq/BV5B7E32evPYUqxAWVnCq2H++pp+Db3w5e9+1vw+jR8OlP62abBIrifngU49TDVqWrZPW6qBTqWg8TsAvl1GpsvIQR6krdOfcn51xH+t//ds59EGgCdnDOHeGce7qUjYytUp9Wn3FG4fVf/GJwr4AI0V35ZuqwzztmHrPfNZt5x8xj9QWrQyeuhb3aj6JXoJIG6rQLE7AzObVBNDZewii6+Ix5OwG9zrk3StCm6lHq0+q//73w+r4+3WyTvKK4H56RqcM+5/1zmH7I9KIS1jJX+80NzZvb01jfSHND8xZX+2G3i6MwXethAnZ7ux8yF0Rj4yWMYorPtAFfAA5Nv26jmS0Hvuqcu6VE7Yu3QkPVojit3msvfx99ICpELQHiVLc97KxrlZidLQphOu0KDYLJBOymJp87q7HxMlhhi898An8P/S7gfOAVYGfgI8BvzOxc59wPStbKuArzKR2Ka6/1SXED0c02CRC3uu1hZ10r9+xsUQjTaZcZ7DJQwK7U2HhJhrBX6p8HrnHOfTJn+dVmdjVwEVB7QT3sp3Sw9tkHPvvZ/MlyGbrZJnkEXfnu9fpeiSvvWmlhO+3CBmyVq5DBChvUdwRuyrPuRuBj0TSnCpX6tPqKK+BTn4JTT4U/5xk5qJttUkDule/SpUsr15iEKqbTTgFbSilsUF8CHIkvCZvrSODeyFpUjaL4lBYaC/O2t8Gf/hRcako320RCy/2Y7R2+uF5Bpe60EwkrbFD/P2C+me0I/Ir+e+ofBo4FzjSzAzIbO+cej7idyRa2LqRutkkVqPSELPkEfcy+/GVfqTmK8qv6eEochA3qt6efP5F+OHx52Izb0s+WXjcsktbVglIXsMm8h2aHkAgMFLDjNiHL5nbn+Zj19QV/zAZLXetSaWGD+rSStqKWhRkLM5Rvie5uXwFDs0PIEA0UsOM6IQuU/mMmEhehgrpz7p5SN6RmlbKATSrl9x+2F0AkjzABO6ppWktB5VelVhRdUU4iVsq6kIXK1Gp2CClCmIAd5wlZBvqYjXnrOuY/NJ9Zd8xi/kPzSa1PBW8sEnN5r9TN7BXgaOfcX8zsn/h75Xk553aOunE1YagFbArdL+/qgp3z/Lfo8kSKECZgx3lClkIfM8dGZr+8F+62VKzyAEQGo1D3+5XAP7L+XTCoyyANZSzMQFnzra1bz+2eoYI1UoQwAfvk8SfHpixtrkIfM3dqG932Mmzw28YlD0BkMPIGdefcl7L+fWlZWlOrBjMWJkzWfHs7zJ8f/HoVrJEihKkj39TQFKuytLmCPmbb7fIadW/evzmgZ6t0HoDIYISt/b4HsJNz7qGAdYcA/3TOPR9142pKsWNhCqXzbtrUn87b2uovU1QRQ4YgbB35uE/IkvsxW/DbdQVvK/zlqZc5fR488QTstx/MmQO7716mxooMQtghbd8HngK2CurAKcC+wAeiapSkDXS/PF8679q1sGSJ//ZqalJFDIlE2IBdTROyDB82PO9thYbl53PlpZ/f/PMDD8B118GVV8K555azlSLhhQ3qbweuzrNuCXB6NM2RzcLcLx850gfwIDfeCFen/8tUEUMiUk0BO4xR246izgIGAb2xK72//TZb1tjyPvUp+MhHYNddS9++cshcO2y7rb9bp9pU1S3skLaRFE6UyzNYRAYl+3555mq8p6d/eXe3/+Rt2pR/H8OGaciayAAytw+aG5pprPdfY431jWyz5JsFXzd7djlaV3qdnb421YwZ8PLL/rmlxS+X6hQ2qD8KfDTPuo8CK6JpjgDhyl81N8MJJ+Tfh4asiYSSua0w75h5zH7XbOYdM49J2/wXQVfpGU8+Wb72lUqYawepPmG73y8HbjSz4cC1wEvAbvhu9xPSD4lK2PJX06bBr3898CTOIlJQ7m2Fe/eHZQ/m337ffcvQqBJT6dxkCnWl7py7GR/A3wH8Fngw/fwO4GPOuV+VqoE1KWyVufZ2n8keREPWJGKp9amaqbo2Z07h9ZdfXp52lJJK5yZT2Ct1nHM/M7Pr8ZnuOwKvAU8651SUJmphq8xpEmcpkdzZ2Pbcbk9O/OWJsZt9rVR2391nuX/qU1uvu/LKZCTJZa4d1NGXLKGDOkA6gD9RorZIRjHBWpM4S8RyZ2Mbuc1I1m7ccpRFLVRdO/dcn+U+e7a/h77vvv4KPQkBHYZeoVriKXRQN7PdgeOAMcCInNXOOTcryobVvGKCtYasSUSCZmPLDejZkl51bddd4dpr/b8LlY2oRrnXDqCOviQIW1Huw8ANwDDgFaA3ZxMHKKhHTcFayqzQbGxBKj37WrkMVDaiWmVfO4wYAfPmqaOv2oW9Uv8a8HvgDOfcmhK2R0QqqNBsbEG2sW1YnVpNan2K5uFVfNlaQJhpFqo5CGauHZYuhalTK90aGaqw49T3AP5PAV0k2TKzsYW10W3kxpU30nJFC53PJbNiSZihXyJxETao34/PeheRBGsf3x5cNjVt5DYjt1rWs6GHVK+/F9/dm7yKJRr6JdUkbFCfCZxtZqeb2e5mNjL3UcpGVr1UyhdVnjXLP+eb41ykwjKzseWWTW1uaOb2j93OiQecSH1dfeBrM0lzSRO2bIRIHIS9p/7X9PNPyF8DftjQm5NASc2wkcQqNBvbXU/fxYa+gMnHSW7SXLmGfiUtu14qI2xQ/ziFJ3SRIEnPsJHEyjcbW+aee1AyXWN9I+NGJe+ytRw1nnTuL1EJFdSdc9eWuB3JpOLKkjDt49uZeXvwZWud1dE+IZkVS0pZ40nn/hKlsPfUBYq/N64MG0mYQvfcF5+6OJGV5TIyQ78+f2kKd/B8vvzHaGrgK7teopT3St3MHsCPS3/czB5kgO5359zhUTcuVgbTP6biypJAhe65J11uCd0oauDr3F+iVKj7fQXwZta/a/ee+mD7x1RcWRIq3z33JAsqoRtFDXyd+0uU8gZ159z/ZP37jLK0Jq4Ge29cs6hJDcid0a19fHsiq8sVKqE7lBr4OveXKA2YKGdmI4DXgfZSzptuZicBlwL7A4c755aV6r2KNpT+Mc2iJglWiu7ouCpUQncow/l07i9RGjCoO+fWmdkrwMYSt+Ux4CPAD0r8PsUbav+YJmaRBCpVd3RclXI4n879JSphs99/AHzGzIJLSUXAObfSOfdkqfY/JO3t/rQ5iPrHpIqk1qd4de2rzLpj6JnbYbqjk6RQCd0ohvNlzv3nzPHPCugyGGGD+g7ABOAZM7vOzL5hZnOzHl8vXRNjINM/1tzcXy+ysbF/uT59UgU6n+uk5YoWnn/jeebeP5cZt80Y0kQspeqOjqtaHs4n1cOcGzip3cz+PsAmzjm3d4j93AnsGrDqIufcr9PbLAUuLHRP3czOBs4G2GWXXQ5duHDhFuu7u7tpKkWg7euDNWtg/XoYPhxGjcp/BR8TJTsWVagWj0Wf62PNm2tYt3Edr/S8gsMxZvgYXlj/wuZt6qyOg3Y5qOBELkFeXfsqz7/xfODVep3Vscd2ezB65Ogh/w6lNJi/icwxXb9pPcOHDWfUtqOKPnZxVIufjyDVcBymTZu23Dk3OWhd2Ipye0XREOfc+yPazzXANQCTJ092U3MmAV66dCm5y2qVjkW/WjsWuUlsGd/c55tc+NSFm39urG9k3j7zis7cTq1P0XJFyxb31DOaG5qr4p56rf1NFKJj4VX7cSh4emlm25rZCWZ2gZmdYma7lKthIjJ42Uls+brIMwbbVa7uaJH4KVRRbm/gTmBs1uI3zOxk59zvo26ImX0Y+C6wE3CLmT3snDs66veJFU3LJCVSKIkt11Ayt2u5upxIHBXqfp8L9AHvBpYDewFX4TPhI+mOz+acuxm4Oer9xpamZZISKpTElmuomdu1WF1OJK4KBfV3ABc45/6Q/nmlmX0i/bybc+6l0jcvoTQtk5RYoTHVGY31jdRZXdFd5bVSQU6kGhUK6rsBT+cs+xtg+Ax2BfXB0pSsUmKFpkg1M2a+fSYH7HRA0V3ltVRBTqQaDTQOo3YncSklTcskJVYoiW2fUfvwraO/xfRDphd9hZ6bfNezoYdUr1/e3dtdkt9FRMIbaEjb7WYWVB72rtzlzrmdo2tWwmlaJimDfElsy+4f3LQKpZrQRESiUyiof6lsrag1mpZJyiTKJLZaqyA3EA1ekTgqNPWqgnqpaFomqUKlnNCk2mjwisRVqIpyUgKalkmqTKHkuygmNKkWGrwicaagXkmaklWqSCb5Ljf7fTDD4qqZBq9InCmoi0hoqiCnwSsSbwrqIlKUWq8gp8ErEmfVP1+giEgZtbfnn3FZg1ek0hTURUSKkBm80tzsr8zBP2eWK0lOKknd7yIiRdLgFYkrBXUR2YombRmYBq9IHCmoi8gWNGmLSPVSUBeRzbInbcnIVJBrW9DG6gtW09TQpCt5kZhSUBeRzcJM2rLv6H11JS8SU8p+F5HNBpq0ZcUrKzT9qkiMKaiLyGaZSVuCNNY38tqbrw14JS8ilaOgLiKbtY9vp86CvxbqrI4dR+6o6VdFYkxBXUQ2y0za0tzQvPmKvbG+keYGv/yAnQ4oeCVfbdOv9rk+5j80n1l3zGL+Q/NJrU8N/CKRGFOinIhsodCkLQftclBipl/tfK6TR/7xCF/84xeV8CeJoSt1EdlKZtKWOe+fw/RDpm+ehW2gK/lqma0tM3Qvk8EPSviTZNCVuogUJQnTr4YZulfLM9FJ9VJQF5GiVfv0qwMN3VPCn1Qrdb+LSM0ZaOhetSX8iWQoqItIzRlo6F41JfyJZFNQF5Gak0n4q7O6qk74E8mle+oiUpOm7DmF3r/1Mm+feVWb8CeSS0FdRGpWndVVdcKfSC51v4uIiCSErtRFykxzkYtIqSioi5RR53OdiZ2LPJWCjg7o6oLWVmhvh2adq4iUlYK6SJlkSpOmevsnDckUQGlb0MbqC1aXPEkrtT7Fq2tfZdYds7bqJRhKD0JnJ7S1QV8f9PRAYyPMnAmLF8OU6j5XEakqCuoiZVLp0qSZXoIv7fUl5j45d4teAmDQPQiplA/oqawJznrSxdra2mD1amhSQrlIWShRTqRMKlmaNLuXIHNikZnA5NgFx3Ls9ceS6k0NanKTjg5/hR6kr8+vF5HyUFAXKZNKliYt1EuwYdMGevt6A9dlehAK6erqvzLP1dMDq1RGXaRsFNRFyqSSpUkL9RKs37Se3k3BQT1MD0Jrq7+HHqSxEcapjLpI2Sioi5RJJeciL9RLMHzYcBqGNQSuC9OD0N4OdXm+Serq/PqkSK1PMf+h+cy6YxbzH5pPan1q4BeJlJES5UTKqFJzkbePb2fm7TMD19UPqwdH4NV6mB6E5maf5Z6b/V5X55cnJUkuycMRJTkU1EXKrBJzkWd6CdoWtG2+BdBY30id1eXNfs+sC3PCMWWKz3Lv6PD30MeN81foSQnocRiOKBKGgrpIjcj0Etx2523MftfsrXoJhtqD0NQE0xNaRr3SwxFFwlJQF6khTQ1NjB45mjlT5wSuU2AKVsnhiCLFUKKciMgAKjkcUaQYCuoiIgMIHI64vgmWT6f39st484FTt6ioJ1IpCuoiIgPYajjis++Cb62G27/DhntnMvvCEbS0+Br4IpWkoC4iEkIm0fDr776KhoV3Qm8z9PpEwp6e/hr43YWr6oqUlIK6iEQuqUVamhqaGP7kf1NfNyJwvWrdS6Up+11EIlVMkZahTPdaKap1L3GmoC4ikSmmSEu1VmjL1LoPCuyqdS+Vpu53EYlMmCItsGXwH8x0r5VUS7XupfooqItIZMIWaQkb/OMoU+u+ubl/drrGxv7lSSmNK9VJ3e8iEplMkZagwJ5dpKXaK7Qlvda9VC8FdRGJTKHZ4LJnfAsb/OMsybXupXqp+12kDJI6xCtX2DnjAyu0pYWZ7lVEgulKXaTEqjXLe7DCzBmfPRXsYKd7FZGtKaiLlFCtzsMdZsa3MMFfRIqjoC5SQpqHuzBN9yoSLd1TFymhas/yFpHqoqAuUkKah1tEyklBXaSElOUtIuWkoC5SQmGHeImIREGJciIlpixvESkXBXWRMlCWt4iUg7rfRUREEiI2Qd3MvmFmT5jZX83sZjPbodJtEhERqSaxCerAHcAE59yBwFPA/1a4PSJlUyu14UWktGJzT9059/usH/8EnFiptoiUU63VhheR0onTlXq2jwO3VroRIqWWXRs+U3muZ0MPqV6/vLu3u8ItFJFqYs658r2Z2Z3ArgGrLnLO/Tq9zUXAZOAjLk/jzOxs4GyAXXbZ5dCFCxdusb67u5umJg0XAh2LbHE8Fq+ufZXn33g+sD58ndWxx3Z7MHrk6EjfM47HoVJ0LPrpWHjVcBymTZu23Dk3OWhdWYP6QMzsdOAc4H3OubVhXjN58mS3bNmyLZYtXbqUqVOnRt/AKqRj0S+Ox2LWHbOYe//cvOtnv2s2c94/J9L3jONxqBQdi346Fl41HAczyxvUY9P9bmbHALOA48MGdJFqp9rwIhKl2AR14HtAM3CHmT1sZldXukEipaba8CISpThlv+uSRGpOpjZ8bvZ7ndWpNryIFC02QV2kVqk2vIhERUFdJAZUG15EohCne+oiIiIyBArqIiIiCaGgLiIikhAK6iIiIgmhoC4iIpIQCuoiIiIJoaAuIiKSEArqIiIiCaHiMyIiNW7Dhg00NTWxcuXKSjel4rbffvvYHIcRI0YwZswY6uvrQ79GQV1EpMa98MIL7LLLLowZMwYzq3RzKiqVStHc3FzpZuCc47XXXuOFF15gr732Cv06db+LiNS4devWsf3229d8QI8TM2PHHXdk3bp1Rb1OQV1ERBTQY2gw/ycK6iIiUnFNTflnJXznO99Zsvf92te+VrJ9V4KCeq1KpWD+fJg1yz+nUpVukYhUizJ9f2zatAmA+++/vyT7BwV1SYLOTmhpgRkzYO5c/9zS4peLiBRS4u+PpUuXMm3aNE455RQmTpwI9F/Fv/TSS7znPe9h0qRJTJgwgfvuu2+r169YsYLDDz+cSZMmceCBB9LV1QXA9ddfv3n5Jz7xCTZt2sTs2bN58803mTRpEqeeeioA3/ve95gwYQITJkzgO9/5DgA9PT3853/+JwcddBATJkygo6MDgMsuu4zDDjuMCRMmcPbZZ+Oci+QYDIWy32tNKgVtbVueWff0+Oe2Nli9Ggp0g4lIDSvT98cDDzzAY489tlXW989//nOOPvpoLrroIjZt2sTatWu3eu3VV1/N+eefz6mnnkpvby+bNm1i5cqVdHR08Ic//IH6+nrOPfdcFixYwOWXX873vvc9Hn74YQCWL1/O9ddfzwMPPIBzjiOOOIIjjzySp59+mt13351bbrkFgNdffx2A8847j4svvhiA0047jd/97nd84AMfGPLvPxS6Uq81HR3Q1xe8rq/PrxcRCVKm74/DDz88cBjXYYcdxk9+8hMuvfRSHn300cChZ+94xzv42te+xte//nWeffZZtt12W+666y6WL1/OYYcdxqRJk7jrrrt4+umnt3ptZ2cnxx13HI2NjTQ1NfGRj3yE++67j4kTJ3LnnXcya9Ys7rvvPrbffnsAlixZwhFHHMHEiRO5++67WbFiRSS//1AoqNearq7+M+tcPT2walV52yMi1aNM3x+NjY2By9/znvdw77330tLSwmmnncZ1113HzTffzKRJk5g0aRLLli3jlFNO4Te/+Q3bbrstRx99NHfffTfOOU4//XQefvhhHn74YZ588kkuvfTSrfafr/t8n332Yfny5UycOJH//d//5bLLLmPdunWce+65LFq0iEcffZSzzjqr6OFnpaCgXmtaWyHPB4bGRhg3rrztEZHqUeHvj2effZadd96Zs846i+nTp/PQQw/x4Q9/eHOwnjx5Mk8//TR77703n/nMZzj++OP561//yvve9z4WLVrEK6+8AsCaNWt49tlnAaivr2fDhg2AP2m45ZZbWLt2LT09Pdx88828+93vZvXq1YwcOZKPfexjXHjhhTz00EObA/jo0aPp7u5m0aJFJf3dw9I99VrT3g4zZwavq6vz60VEglT4+2Pp0qV84xvfoL6+nqamJq677rqttuno6OD666+nvr6eXXfdlYsvvphRo0bxla98haOOOoq+vj7q6+u58soreetb38rZZ5/NgQceyCGHHMKCBQs49dRTOfzwwwE488wzOfjgg7n99tv53Oc+R11dHfX19Xz/+99nhx124KyzzmLixImMHTuWww47rKS/e2jOuap+HHrooS7XkiVLtlpWqwKPxX33Odfc7Fxjo3Pgn5ub/fIE09+Fp+PQT8fCe/zxx90bb7wRbuOEf3+EPg5l8vjjj2+1DFjm8sREXanXoilTfJZqR4e/BzZunD/DVta7iAxE3x+xpqBeq5qaYPr0SrdCRKqRvj9iS4lyIiIiCaGgLiIikhAK6iIiIgmhoC4iIpIQCuoiIlJxlZp6NYzVq1dz4oknDuq1U6dOZdmyZRG3KD9lv4uISFFS61N0rOig67UuWndspX18O83Dt67DPlSbNm1i2LBhJZ16NdvGjRsDl+++++5lqxiX+Z0HS1fqIiISWudznbRc0cKM22Yw9/65zLhtBi1XtND5XOWnXn399dcZO3YsfelJZ9auXcsee+zBhg0b+Nvf/sYxxxzDoYceyrvf/W6eeOIJAM444wxmzpzJtGnTmDVrFp2dnZtryR988MGkUimeeeYZJkyYAPige+GFFzJx4kQOPPBAvvvd7wJw1113cfDBBzNx4kQ+/vGPs379+q1+txtuuIGJEycyYcIEZs2atXl5U1MTF198MUcccQR//OMfh3T8dKUuIiKhpNanaFvQRqq3f+rVng1+gpe2BW2svmA1TQ2Vm3p1++2356CDDuKee+5h2rRp/Pa3v+Xoo4+mvr6es88+m6uvvprW1lb+/Oc/c+6553L33XcD8NRTT3HnnXcybNgwjj32WK688kre9a530d3dzYgRI7Z4j2uuuYa///3v/OUvf2GbbbZhzZo1rFu3jjPOOIO77rqLffbZh//+7//m+9//PjNmzNj8utWrVzNr1iyWL1/OW97yFo466ih+9atf8aEPfYienh4mTJjAZZddNuRjpyt1EREJpWNFB30ueOrVPtdHx2OVn3q1vb2djvQUsAsXLqS9vZ3u7m7uv/9+TjrpJCZNmsQnPvEJXnrppc2vOemkkzZ3eb/97W9n5syZ/N///R///ve/2WabLa9977zzTs4555zNy0eNGsWTTz7JXnvtxT777APA6aefzr333rvF6x588EGmTp3KTjvtxDbbbMOpp566eZthw4ZxwgknDPZwbUFBXUREQul6rWvzlXmung09rFpT+alXjz/+eG699VbWrFnD8uXLee9730tfXx877LDD5tncHn74YVauXBn4fjNnzmT+/Pm8+eabvP3tb9/cTZ/hnMPMtlo2kELbjBgxYkj30bMpqIuISCitO7bSWB8ccBvrGxk3qvJTrzY1NXH44Ydz/vnnc9xxxzFs2DC222479tprL375y18CPsA+8sgjge/x9NNPM3HiRGbNmsXkyZO3CupHHXUUV1999eakujVr1rDffvvxzDPPsCo9n/zPfvYzjjzyyC1ed8QRR3DPPffw6quvsmnTJm644YattomCgrqIiITSPr6dOgsOG3VWR/uE0k+9mklgu/HGGzn//PMDt2tvb+f666+nPWsq2AULFvCjH/2Igw46iPHjx/PrX/868LVXXXUVEyZM4KCDDmLbbbfl2GOP3WL9mWeeyZ577smBBx7IQQcdxM9//nNGjBjBT37yE0466SQmTpxIXV0d55xzzhav22233ZgzZw7Tpk3joIMO4pBDDuGDH/zgEI/I1ixMt0GcTZ482eWOAVy6dClTp06tTINiRsein46Fp+PQT8fCW7lyJWPGjAm8R52r87lO2ha00ef66NnQQ2N9I3VWx+JTFzNlzyllaG1ppVKpUMehXFauXMn++++/xTIzW+6cmxy0vbLfRUQktCl7TmH1BavpeKyDVWtWMW7UONontEeS9S5Dp6AukhDlKggi0tTQxPRDNPVqHCmoiyRAUJfozNtnJqZLVETCUaKcSJXLLgiSGW7Us6GHVK9f3t3bXeEWiki5KKiLVLlyFQQRkfhTUBepcuUqCCIi8aegLlLlKl0QRCQKpZ569eKLL+bOO+8s6jW/+c1vuPzyywtuM5RpWUtBiXIiVa59fDszb58ZuK4cBUGk9qRS0NEBXV3Q2grt7VCKod1RTr2ab7KUQlOdHn/88Rx//PEF91vOaVnD0JW6SJVrHt7M4lMX09zQvPmKvbG+keYGv1zjhyVKnZ3Q0gIzZsDcuf65pcUvj0Kppl4944wzNgffsWPHctlllzFlyhR++ctfsnjxYvbbbz+mTJnC5z73OY477jgArr32Ws477zzAT9H6mc98hne+853svffem/cVZlrWyy67jMMOO4wJEyZw9tlnh6oVP1i6UhdJABUEkXJIpaCtzT9n9KTTOdraYPVqKNCLHloppl7NNWLE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\n",
      "text/plain": [
       "<Figure size 576x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize = (8,8))\n",
    "ax = fig.add_subplot(1,1,1) \n",
    "ax.set_xlabel('Principal Component 1', fontsize = 15)\n",
    "ax.set_ylabel('Principal Component 2', fontsize = 15)\n",
    "ax.set_title('2 Component PCA', fontsize = 20)\n",
    "\n",
    "\n",
    "targets = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']\n",
    "colors = ['r', 'g', 'b']\n",
    "for target, color in zip(targets,colors):\n",
    "    indicesToKeep = finalDf['target'] == target\n",
    "    ax.scatter(finalDf.loc[indicesToKeep, 'principal component 1']\n",
    "               , finalDf.loc[indicesToKeep, 'principal component 2']\n",
    "               , c = color\n",
    "               , s = 50)\n",
    "ax.legend(targets)\n",
    "ax.grid()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The three classes appear to be well separated! \n",
    "\n",
    "iris-virginica and iris-versicolor could be better separated, but still good!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Explained Variance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The explained variance tells us how much information (variance) can be attributed to each of the principal components."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.72770452, 0.23030523])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca.explained_variance_ratio_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Together, the first two principal components contain 95.80% of the information. The first principal component contains 72.77% of the variance and the second principal component contains 23.03% of the variance. The third and fourth principal component contained the rest of the variance of the dataset. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## What are other applications of PCA (other than visualizing data)?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If your learning algorithm is too slow because the input dimension is too high, then using PCA to speed it up is a reasonable choice. (<b>most common application in my opinion</b>). We will see this in the MNIST dataset. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If memory or disk space is limited, PCA allows you to save space in exchange for losing a little of the data's information. This can be a reasonable tradeoff."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## What are the limitations of PCA? "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- PCA is not scale invariant. check: we need to scale our data first. \n",
    "- The directions with largest variance are assumed to be of the most interest \n",
    "- Only considers orthogonal transformations (rotations) of the original variables \n",
    "- PCA is only based on the mean vector and covariance matrix. Some distributions (multivariate normal) are characterized by this, but some are not. \n",
    "- If the variables are correlated, PCA can achieve dimension reduction. If not, PCA just orders them according to their variances. "
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
